package com.ruoyi.aitseeyon.utils;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.ruoyi.aitcommon.utils.ObjUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.ruoyi.aitcommon.config.ConfigManager;
import com.ruoyi.aitcommon.utils.ExceptionUtils;
import com.ruoyi.aitcommon.utils.ListMapUtils;
import com.ruoyi.aitcommon.utils.SQLUtils;
import com.ruoyi.common.core.redis.RedisCache;

@Component
//@CacheConfig(cacheNames={"ZYOAFieldTransUtils"})
public class ZYOAFieldTransUtils {
	@Autowired
	RedisCache redisCache;
	@Autowired
	ConfigManager configManager;
	
	private String prefix="ZYOAFieldTransUtils:";
			
	/**
	 * OA数据翻译器,Code->ID翻译,查询OA档案表
	 * @param datalist OA接口数据
	 * @param transmap context中配置的翻译器
	 * @param oadb db链接
	 * @return 翻译后的数据
	 * @throws Exception
	 */
	public List<Map<String,Object>> DataTrans(List<Map<String,Object>> datalist
			,Map<String,Object> transmap,JSONObject oadb) throws Exception{
		List<Map<String,Object>> retlist=new ArrayList<Map<String,Object>>();
		for(Map<String,Object> data:datalist) {
			Map<String,Object> retmap=new LinkedHashMap<String,Object>();
			for(String key:data.keySet()) {
//				增对每个字段进行翻译
				Object value=data.get(key);
				if(transmap.containsKey(key)) {
//					如果存在翻译SQL,进行Code->ID的翻译
					if(value!=null) {
						Object idvalue = this.commTrans(key, value.toString(), oadb, transmap);
						retmap.put(key, idvalue);
					}
				}
				else {
					retmap.put(key, value);
				}
			}
			retlist.add(retmap);
		}
		return retlist;
	}
	
	/**
	 * 通过上下文获取翻译SQL,进行通用OA翻译 Code->ID
	 * @param field 字段名
	 * @param code 字段编码
	 * @param oadb 数据库链接
	 * @param transmap 字段翻译器
	 * @return id
	 */
//	@Cacheable(cacheNames="ZYOAFieldTransUtils.commTrans.#field",key="#code")
	private Object commTrans(String field,String code,JSONObject oadb,Map<String,Object> transmap) 
			throws Exception {
		Object path = transmap.get(field);
//		从缓存获取
		String key=prefix+path+"_"+code;
		if(redisCache.getCacheObject(key)!=null)
			return redisCache.getCacheObject(key);
		
//		从数据库获取Code对应ID
		Object sqltemp=configManager.getContextByParm(path.toString());
		ExceptionUtils.checkBlankOrUndefined(sqltemp, "获取sql错误,path:[{}]",path);
		String sql=String.format(sqltemp.toString(), code);
		List<Map<String,Object>> retlist = SQLUtils.execQuery(sql, oadb);
		Object idvalue = null;
		idvalue=ListMapUtils.getColumnValue(retlist, "ID");
		if(idvalue==null)
			idvalue=ListMapUtils.getColumnValue(retlist, "id");
		ExceptionUtils.checkBlankOrUndefined(idvalue, "查找字段[{}]失败,sql:{}",field,sql);
		
//		设置缓存
		redisCache.setCacheObject(key, idvalue);
		return idvalue;
	}

	/**
	 * 登陆账号翻译,将 人员编码/人员姓名 翻译为 登录名
	 * @param field 翻译字段,需要配置 登陆账号类型 CODE=人员编号 NAME=姓名 LOGINNAME=登录名
	 * @param code 对应编码,人员编码/人员姓名/登陆名
	 * @param oadb 数据库链接
	 * @return OA中配置的登录名
	 */
	public Object loginTrans(String field,String code,JSONObject oadb) throws Exception {
//		从缓存获取
		String key=prefix+"login_"+field+"_"+code;
//		考虑到人员编码/人员姓名会进行修改,所以不做缓存
//		考虑效率,先启用缓存
		if(redisCache.getCacheObject(key)!=null)
			return redisCache.getCacheObject(key);

//		从OA数据库翻译登陆账号
		String sql="SELECT member.CODE,member.NAME,user1.LOGIN_NAME LOGINNAME\n" +
				"FROM ORG_MEMBER member\n" +
				"join ORG_PRINCIPAL user1 on user1.MEMBER_ID=member.ID";
		String path=field+" = '"+code+"'";
		final List<Map<String, Object>> retlist = SQLUtils.execQueryPath(sql, path, oadb);
		ObjUtils.checkBlank(retlist,"OA登陆账号翻译失败,OA员工档案字段[%s],值[%s]",field,code);
		final Object loginname = retlist.get(0).get("LOGINNAME");
		ObjUtils.checkBlank(loginname,"获取OA登陆账号为空");
//		设置缓存
		redisCache.setCacheObject(key, loginname);
		return loginname;

	}

}
